// 防止头文件被重复包含
#pragma once

// 包含必要的头文件
#include <iostream>
// 提供系统数据类型定义
#include <sys/types.h>
// 提供套接字编程相关函数和数据类型
#include <sys/socket.h>
// 提供IP地址转换函数
#include <arpa/inet.h>
// 提供Internet地址族相关数据结构
#include <netinet/in.h>

// 定义一个名为InetAddr的类，用于处理网络地址信息
class InetAddr
{
private:
    // 从sockaddr_in结构体中提取IP地址和端口号的私有方法
    // ip: 用于存储提取的IP地址字符串的指针
    // port: 用于存储提取的端口号的指针
    void GetAddress(std::string *ip, uint16_t *port)
    {
        // 将网络字节序的端口号转换为主机字节序，并存储到port指针指向的位置
        *port = ntohs(_addr.sin_port);
        // 将网络字节序的IP地址转换为点分十进制字符串，并存储到ip指针指向的位置
        *ip = inet_ntoa(_addr.sin_addr);
    }

public:
    // 构造函数，使用传入的sockaddr_in结构体初始化对象
    // addr: 包含网络地址信息的sockaddr_in结构体引用
    InetAddr(const struct sockaddr_in &addr) : _addr(addr)
    {
        // 调用GetAddress方法，从传入的sockaddr_in结构体中提取IP地址和端口号
        GetAddress(&_ip, &_port);
    }

    // 获取IP地址的公共方法
    std::string Ip()
    {
        // 返回存储的IP地址字符串
        return _ip;
    }

    // 获取端口号的公共方法
    uint16_t Port()
    {
        // 返回存储的端口号
        return _port;
    }

    // 析构函数，目前为空，可用于释放资源
    ~InetAddr()
    {
    }

private:
    // 存储网络地址信息的sockaddr_in结构体
    struct sockaddr_in _addr;
    // 存储提取的IP地址字符串
    std::string _ip;
    // 存储提取的端口号
    uint16_t _port;
};